Software developers typically use software components when developing an application in order to maximize reuse of logic, decrease development time, and reduce testing time. Components are reusable pieces of software which can be separately packaged. Examples of components include, but are not limited to, libraries, controls, widgets, and Enterprise JavaBeans™. Components can supply basic functionality like string manipulation, mathematical operations, and input/output operations to name a few. Components can be assembled into applications or larger components. Components expose the functionality they implement through a set of application programming interfaces (APIs). The use of these APIs by an application establishes a dependency between the application and one or more components.
Although components simplify the development of applications, they increase the complexity of project configuration. Integrated development environments (IDEs) typically use projects as logical containers for the code associated with an application. A project can include references to components used in the project. The references generally provide the locations of pre-built components on the developer's system and may be provided to an IDE when the developer configures the project, for example. The locations can be used by the IDE to access components and obtain information about their APIs. The IDE can use this information to provide features, such as statement completion and dynamic syntax checking as the developer implements the application.
When building a component, the developer can choose whether to create a separate project for the component or to include the component in the application's project. This choice effects the project's visibility into changes made to the component. When a component is built in a separate project, the application's project can only see and reference changes to the component after the component is rebuilt. IDE features such as dynamic syntax checking and statement completion will use the compiled version of the component and will not provide information about recent changes to the component until it is rebuilt. Another effect of component changes not being visible to dependent projects is the creation of compile time and run time errors. These result from the developer believing that the application code and the components it uses are consistent since the IDE does not display errors. But when the code is compiled or executed, the application improperly attempts to call the modified component through its old interface resulting in errors.
Alternately, the application developer may include the component directly in the application's project. This project configuration provides immediate visibility into changes to the component but may result in undesirable dependencies between the component and the application thereby reducing the ability to reuse the component in other applications. In addition, copying components into all the projects that use them results in an inefficient use of storage and complicates deployment of component changes.